/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logistica.beans;

import entities.FacturaPedidoFabrica;
import entities.LineaFacturaPedidoFabrica;
import entities.PedidoFabrica;
import entities.Producto;
import entities.ProductoTalla;
import entities.Talla;
import entities.Usuario;
import facades.FacturaPedidoFabricaFacade;
import facades.LineaFacturaPedidoFabricaFacade;
import facades.PedidoFabricaFacade;
import facades.ProductoTallaFacade;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadEditada;
import qualifiers.EventoEntidadElegida;
import qualifiers.UsuarioLogeado;
import ventas.datamodel.TablaPedidoDataModel;

/**
 *
 * @author damfercer
 */
@Named(value = "nuevaRecepcionPedidoFabricaBean")
@SessionScoped
public class NuevaRecepcionPedidoFabricaBean implements Serializable {
    @Inject
    @UsuarioLogeado
    private Usuario usuario;
    @Inject
    private TablaPedidoDataModel tablaPedidoDataModel;
    private FacturaPedidoFabrica facturaPedidoFabrica;
    @Inject
    @EventoEntidadCreada
    private Event<FacturaPedidoFabrica> eventoNuevaFacturaPedidoFabrica;
    @Inject
    @EventoEntidadEditada
    private Event<PedidoFabrica> eventoPedidoFabricaEditado;
    @Inject
    @EventoEntidadCreada
    private Event<LineaFacturaPedidoFabrica> eventoNuevaLineaFacturaPedidoFabrica;
    @Inject
    private PedidoFabricaFacade pedidoFabricaFacade;
    @Inject
    private FacturaPedidoFabricaFacade facturaPedidoFabricaFacade;
    @Inject
    private ProductoTallaFacade productoTallaFacade;
    @Inject
    private LineaFacturaPedidoFabricaFacade lineaFacturaPedidoFabricaFacade;
    private Map<Integer, LineaFacturaPedidoFabrica> lineas;
    private PedidoFabrica pedidoFabrica;
    /**
     * Creates a new instance of NuevaRecepcionPedidoFabricaBean
     */
    public NuevaRecepcionPedidoFabricaBean() {
    }
    
    public void onElegirPedidoFabrica(@Observes @EventoEntidadElegida PedidoFabrica pf){
        this.pedidoFabrica=pf;
        this.setFacturaPedidoFabrica(new FacturaPedidoFabrica());
        this.getFacturaPedidoFabrica().setPedidoFabrica(pf);
        this.getFacturaPedidoFabrica().setFecha(new Date());
        this.lineas=new HashMap<Integer, LineaFacturaPedidoFabrica>();
        tablaPedidoDataModel.setPedido(pf);
    }
    
    public String guardar(){
        facturaPedidoFabricaFacade.create(getFacturaPedidoFabrica());
        for(LineaFacturaPedidoFabrica linea: lineas.values()){
            if(linea.getCantidad()!=0){
                linea.setFacturaPedidoFabrica(getFacturaPedidoFabrica());
                linea.setOk(Boolean.FALSE);
                lineaFacturaPedidoFabricaFacade.create(linea);
                eventoNuevaLineaFacturaPedidoFabrica.fire(linea);
                if(facturaPedidoFabrica.getLineaFacturaPedidoFabricaList()==null){
                    facturaPedidoFabrica.setLineaFacturaPedidoFabricaList(new ArrayList<LineaFacturaPedidoFabrica>());
                }
                facturaPedidoFabrica.getLineaFacturaPedidoFabricaList().add(linea);
            }
        }
        if(facturaPedidoFabrica.getPedidoFabrica().getFacturaPedidoFabricaList()==null){
            facturaPedidoFabrica.getPedidoFabrica().setFacturaPedidoFabricaList(new ArrayList<FacturaPedidoFabrica>());
        }
        facturaPedidoFabrica.getPedidoFabrica().getFacturaPedidoFabricaList().add(facturaPedidoFabrica);
        pedidoFabricaFacade.evict(facturaPedidoFabrica.getPedidoFabrica(), facturaPedidoFabrica.getPedidoFabrica().getIdPedidoFabrica());
        facturaPedidoFabricaFacade.evict(facturaPedidoFabrica, facturaPedidoFabrica.getIdFacturaPedidoFabrica());
        
        eventoNuevaFacturaPedidoFabrica.fire(facturaPedidoFabrica);
        eventoPedidoFabricaEditado.fire(facturaPedidoFabrica.getPedidoFabrica());
        String editarFactura="/views/revision/EditarFacturaPedidoFabrica?faces-redirect=true";
        if(usuario.getTipoUsuario().getDescripcion().toLowerCase().equals("logistica")){
            editarFactura="/views/logistica/EditarRecepcionPedidoFabrica?faces-redirect=true";
        }
        return editarFactura; 
    }
    
    public LineaFacturaPedidoFabrica recuperarLineaFacturaPedidoFabrica(Producto p, Talla t){
        if(p==null || t==null){
            return null;
        }
        else{
            ProductoTalla pt=productoTallaFacade.getProductoTallaDeProductoYTalla(p, t);
            if(pt!=null){
                if(!lineas.containsKey(pt.getIdProductoTalla())){
                    LineaFacturaPedidoFabrica lf=new LineaFacturaPedidoFabrica();
                    lf.setProductoTalla(pt);
                    lf.setCantidad(0);
                    lineas.put(pt.getIdProductoTalla(), lf);
                }
                return lineas.get(pt.getIdProductoTalla());
            }
            else{
                return null;
            }
        }
    }

    /**
     * @return the facturaPedidoFabrica
     */
    public FacturaPedidoFabrica getFacturaPedidoFabrica() {
        return facturaPedidoFabrica;
    }

    /**
     * @param facturaPedidoFabrica the facturaPedidoFabrica to set
     */
    public void setFacturaPedidoFabrica(FacturaPedidoFabrica facturaPedidoFabrica) {
        this.facturaPedidoFabrica = facturaPedidoFabrica;
    }

    /**
     * @return the tablaPedidoDataModel
     */
    public TablaPedidoDataModel getTablaPedidoDataModel() {
        return tablaPedidoDataModel;
    }

    /**
     * @param tablaPedidoDataModel the tablaPedidoDataModel to set
     */
    public void setTablaPedidoDataModel(TablaPedidoDataModel tablaPedidoDataModel) {
        this.tablaPedidoDataModel = tablaPedidoDataModel;
    }

    /**
     * @return the pedidoFabrica
     */
    public PedidoFabrica getPedidoFabrica() {
        return pedidoFabrica;
    }

    /**
     * @param pedidoFabrica the pedidoFabrica to set
     */
    public void setPedidoFabrica(PedidoFabrica pedidoFabrica) {
        this.pedidoFabrica = pedidoFabrica;
    }
}
